package com.example.limiting.taskmanager2;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import java.io.IOException;

import cn.jpush.android.api.JPushInterface;

/**
 * 自定义接收器
 *
 * 如果不定义这个 Receiver，则：
 * 1) 默认用户会打开主界面
 * 2) 接收不到自定义消息
 */
public class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "JPush";
    private Context mContext;
    @Override
    public void onReceive(Context context, Intent intent) {
        mContext = context;
        Bundle bundle = intent.getExtras();
        Log.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));

        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
            //send the Registration Id to your server...

        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
            processCustomMessage(context, bundle);

        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 接收到推送下来的通知");
            int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
            Log.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);

        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用户点击打开了通知");

            //打开自定义的Activity
//            Intent i = new Intent(context, DetailActivity.class);
//            i.putExtras(bundle);
//            //i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
//
//            String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
//            String content = bundle.getString(JPushInterface.EXTRA_ALERT);
//
//            i.putExtra("title", content);
//            i.putExtra("start_time","起始时间");
//            i.putExtra("end_time","结束时间");
//            i.putExtra("type","种类");
//            i.putExtra("content","详细信息");
//
//            context.startActivity(i);

            new LoadDetailTask().execute(bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE));


        } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
            //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码，比如打开新的Activity， 打开一个网页等..

        } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
            boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
            Log.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
        } else {
            Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
        }
    }

    // 打印所有的 intent extra 数据
    private static String printBundle(Bundle bundle) {
        StringBuilder sb = new StringBuilder();
        for (String key : bundle.keySet()) {
            if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
                sb.append("\nkey:" + key + ", value:" + bundle.getInt(key));
            }else if(key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)){
                sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key));
            }
            else {
                sb.append("\nkey:" + key + ", value:" + bundle.getString(key));
            }
        }
        return sb.toString();
    }

    //send msg to MainActivity
//    private void processCustomMessage(Context context, Bundle bundle) {
//        if (MainActivity.isForeground) {
//            String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
//            String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
//            Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION);
//            msgIntent.putExtra(MainActivity.KEY_MESSAGE, message);
//            if (!ExampleUtil.isEmpty(extras)) {
//                try {
//                    JSONObject extraJson = new JSONObject(extras);
//                    if (null != extraJson && extraJson.length() > 0) {
//                        msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras);
//                    }
//                } catch (JSONException e) {
//
//                }
//
//            }
//            context.sendBroadcast(msgIntent);
//        }
//    }


    public String processCustomMessage(Context context,Bundle bundle){
        String data = bundle.getString(JPushInterface.EXTRA_MESSAGE);

        String taskId = null;
        String taskTitle = null;
        String publisher = null;

        JSONTokener jsonParser = new JSONTokener(data);
        try {
            JSONObject jdata = (JSONObject) jsonParser.nextValue();
            taskId = jdata.getString("taskId");
            taskTitle = jdata.getString("taskTitle");
            publisher = jdata.getString("publisher");
        } catch (JSONException e) {
            e.printStackTrace();
        }

        new LoadDetailTask2().execute(taskId, taskTitle, publisher);



        return null;
    }

    private class LoadDetailTask extends AsyncTask<String,Void,String> {
        private int planet_number = 1;
        private int action_number = 2;
        @Override
        protected String doInBackground(String... params) {
            HttpHelper httpHelper = new HttpHelper(mContext);
            String result = null;
            try {
                result = httpHelper.loadDetail(params[0]);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            Intent intent = new Intent(mContext,DetailActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.putExtra("data", result);
            intent.putExtra("planet_number", planet_number);
            intent.putExtra("action_number",action_number);
            mContext.startActivity(intent);
        }
    }

    private class LoadDetailTask2 extends AsyncTask<String,Void,String> {
        private int planet_number = 1;
        private int action_number = 2;

        private String taskTitle;
        private String publisher;
        @Override
        protected String doInBackground(String... params) {
            HttpHelper httpHelper = new HttpHelper(mContext);
            String result = null;
            try {
                result = httpHelper.loadDetail(params[0]);
            } catch (IOException e) {
                e.printStackTrace();
            }

            taskTitle = params[1];
            publisher = params[2];
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
//            Intent intent = new Intent(mContext,DetailActivity.class);
//            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
//            intent.putExtra("data", result);
//            intent.putExtra("planet_number", planet_number);
//            intent.putExtra("action_number",action_number);
//            mContext.startActivity(intent);
            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(mContext)
                            .setSmallIcon(R.drawable.logo)
                            .setContentTitle("新任务！")
                            .setContentText("任务标题："+taskTitle+" 发布人："+publisher);

            Intent resultIntent = new Intent(mContext, DetailActivity.class);
            resultIntent.putExtra("data", result);
            resultIntent.putExtra("planet_number", planet_number);
            resultIntent.putExtra("action_number",action_number);

            PendingIntent resultPendingIntent =
                    PendingIntent.getActivity(
                            mContext,
                            0,
                            resultIntent,
                            PendingIntent.FLAG_UPDATE_CURRENT
                    );

            mBuilder.setContentIntent(resultPendingIntent);

            mBuilder.setAutoCancel(true);

            int mNotificationId = 001;

            NotificationManager mNotifyMgr =
                    (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

            mNotifyMgr.notify(mNotificationId, mBuilder.build());

        }
    }

}
